#ifndef _THREAD_POOL_H
#define _THREAD_POOL_H
#include <pthread.h>

struct Task_t
{
    /* 回调函数 */
    void *(*function)(void *arg);
    /* 回调函数的参数 */
    void *arg;
};

void *workerThreadFunc(void *arg);
void *m_managerThreadFunc(void *arg);

class ThreadPool
{
public:
    /* 友元 */
    friend void *workerThreadFunc(void *arg);
    friend void *m_managerThreadFunc(void *arg);

public:
    /* 构造函数 */
    ThreadPool(int minThread, int maxThread, int maxQueueCapacity);
    /* 析构函数 */
    ~ThreadPool();

public:
    /* 添加任务 */
    void addTask(void *(*function)(void *arg), void *arg);

private:
    /* 线程退出 */
    void exitThread(pthread_t tid);

private:
    /* 队列容量 */
    int m_queueCapacity;
    /* 队列的元素个数 */
    int m_queueSize;
    /* 任务队列 */
    Task_t *m_queue;
    /* 队头 */
    int m_queueFront;
    /* 队尾 */
    int m_queueTail;

    /* 工作线程 */
    pthread_t *m_threadId;
    /* 管理者线程 */
    pthread_t m_managerThreadId;
    /* 存活的线程数 */
    int m_aliveThreadNum;
    /* 忙碌的线程数 */
    int m_busyThreadNum;
    /* 最小的线程数(下限) */
    int m_minThreadNum;
    /* 最大的线程数(上限)*/
    int m_maxThreadNum;

    /* 锁 */
    pthread_mutex_t m_mutex;
    /* 忙碌锁 */
    pthread_mutex_t m_busyMutex;
    /* 条件变量 */
    pthread_cond_t m_queueNotEmpty;
    /* 条件变量-2 */
    pthread_cond_t m_queueNotFull;

    /* 要离开的线程数 */
    int exitNum;
};

#endif //_THREAD_POOL_H